/* org.manalith.ircbot.plugin.google/GooglePlugin.java ManalithBot - An open source IRC bot based on the PircBot Framework. Copyright (C) 2011 Ki-Beom, Kim This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.manalith.ircbot.plugin.google; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.Collections; import org.apache.commons.lang3.ArrayUtils; import org.json.JSONException; import org.json.JSONObject; import org.manalith.ircbot.plugin.SimplePlugin; import org.manalith.ircbot.resources.MessageEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @Component public class GooglePlugin extends SimplePlugin { private Logger logger = LoggerFactory.getLogger(getClass()); private static final String NAMESPACE = "!구글"; private static final String HIGH_INTENSITY = "\u0002"; private static final String LOW_INTENSITY = "\u000f"; // private static final String HIGH_INTENSITY = "\u001B[1m"; // private static final String LOW_INTENSITY = "\u001B[2m"; private String apiKey; private String apiReferer; @Override public String getName() { return "Google"; } @Override public String getCommands() { return NAMESPACE; } @Override public String getHelp() { return "설 명: 구글 검색 결과를 보여줍니다, 사용법: !구글 [키워드], !gg [키워드], !구글:match [키워드1] [키워드2], !gg:match [키워드1] [키워드2]"; } @Override public void onMessage(MessageEvent event) { String message = event.getMessage(); if (message.equals(NAMESPACE + ":help")) { event.respond(getHelp()); } else if (message.length() >= 12 && (message.substring(0, 9).equals(NAMESPACE + ":match ") || message .substring(0, 9).equals("!gg:match "))) { String[] keywords = message.substring(9).split(" "); event.respond(getGoogleMatch(keywords[0], keywords[1])); } else if (message.length() >= 5 && (message.substring(0, 4).equals(NAMESPACE + " ") || message .substring(0, 4).equals("!gg "))) { event.respond(getGoogleTopResult(message.substring(4))); } } private int getGoogleCount(String keyword) { try { // http://code.google.com/apis/websearch/docs/#fonje URL url = new URL( "https://ajax.googleapis.com/ajax/services/search/web?v=1.0&" + "q=" + URLEncoder.encode(keyword, "UTF-8") + "&key=" + apiKey + "&userip=" + InetAddress.getLocalHost().getHostAddress()); URLConnection connection = url.openConnection(); connection.addRequestProperty("Referer", apiReferer); String line; StringBuilder builder = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader( connection.getInputStream())); while ((line = reader.readLine()) != null) { builder.append(line); } return Integer.parseInt(new JSONObject(builder.toString()) .getJSONObject("responseData").getJSONObject("cursor") .getString("estimatedResultCount")); } catch (MalformedURLException e) { logger.error(e.getMessage(), e); } catch (IOException e) { logger.error(e.getMessage(), e); } catch (JSONException e) { logger.error(e.getMessage(), e); } return -1; } public String getGoogleMatch(String keyword1, String keyword2) { return getGoogleCount(keyword1) + " : " + getGoogleCount(keyword2); } public String getGoogleTopResult(String keyword) { try { // http://code.google.com/apis/websearch/docs/#fonje final String url = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0" // + "&q=" + keyword // + "&key=" + apiKey // + "&userip=" + InetAddress.getLocalHost().getHostAddress(); MappingJackson2HttpMessageConverter conv = new MappingJackson2HttpMessageConverter(); conv.setSupportedMediaTypes(Collections .singletonList(new MediaType("text", "javascript", Charset .forName("UTF-8")))); RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(conv); SearchResponse res = restTemplate.getForObject(url, SearchResponse.class); if (res.responseData != null && ArrayUtils.isNotEmpty(res.responseData.results)) { SearchResult result = res.responseData.results[0]; // HTML 코드 처리 return result.content.replace("<b>", HIGH_INTENSITY) .replace("</b>", LOW_INTENSITY).replace(""", "\"") .replace("'", "'").replace(">", ">") .replace("<", "<").replace("&", "&") .replace("\n", "") + " : " + result.unescapedUrl; } } catch (IOException e) { logger.warn(e.getMessage(), e); } return null; } public String getApiKey() { return apiKey; } public void setApiKey(String apiKey) { this.apiKey = apiKey; } public String getApiReferer() { return apiReferer; } public void setApiReferer(String apiReferer) { this.apiReferer = apiReferer; } @SuppressWarnings("unused") @JsonIgnoreProperties(ignoreUnknown = true) private static class SearchResponse { public SearchResponseData responseData; public int responseStatus; } @JsonIgnoreProperties(ignoreUnknown = true) private static class SearchResponseData { public SearchResult[] results; } @SuppressWarnings("unused") @JsonIgnoreProperties(ignoreUnknown = true) private static class SearchResult { public String GsearchResultClass; public String unescapedUrl; public String url; public String visibleUrl; public String cacheUrl; public String title; public String titleNoFormatting; public String content; } }